/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.ChamadoCab;


/**
 * Define as regras de manipulação de dados para o banco de cabecalho de chamados;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOChamadoCab {

     private final String SQL_LISTA_CABECALHOS = "SELECT a.cab_codigo, a.cab_data, a.cab_hora, a.cab_criticidade, a.cab_situacao, b.cat_descricao, c.ope_nome, d.cli_nome from cab_chamados a, categorias b, operadores c, clientes d where cab_cat_codigo = cat_codigo and cab_ope_codigo = ope_codigo and cab_cli_codigo = cli_codigo ORDER BY cab_data";
     private final String SQL_INCLUIR_CABECALHO = "INSERT INTO cab_chamados (cab_cat_codigo, cab_ope_codigo, cab_usu_codigo, cab_criticidade, cab_situacao, cab_cli_codigo, cab_data, cab_hora) VALUES (?,?,?,?,?,?,current_date, current_time) returning cab_codigo";
     
     private final String SQL_TROCA_STATUS = "UPDATE cab_chamados set cab_situacao=? where cab_codigo=?";

     private String SQL_LISTA_CABECALHOS_COM_FILTRO = "SELECT a.cab_codigo, a.cab_data, to_char(a.cab_hora, 'HH24:MI:SS'), b.cat_descricao, c.ope_nome, d.cli_nome, criticidade_to_str(cab_criticidade) as cab_criticidade, situacao_to_str(cab_situacao) as cab_situacao from cab_chamados a, categorias b, operadores c, clientes d where cab_cat_codigo = cat_codigo and cab_ope_codigo = ope_codigo and cab_cli_codigo = cli_codigo";

     private String filtroDataInicial;
     private String filtroDataFinal;
     private int filtroCodigoCliente;
     private int filtroCodigoChamado;
     private int filtroCodigocategoria;
     private int filtroCodigoOperador;
     private int filtroCriticidade;
     private int filtroStatus;


     /**
      * construtor da classe
      */
     public void DAOChamadoCab() {
         this.clearFiltros();
     }


     /**
      * Define o status de um chamado passados por parametro
      * @param pCodChamado
      * @param pStatus
      */
     public void setStatus(int pCodChamado, int pStatus) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult;

        try{
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_TROCA_STATUS);

            sqlQuery.setInt(1, pStatus);
            sqlQuery.setInt(2, pCodChamado);

            System.out.println("DAOChamadoCab.setStatus:");
            System.out.println(sqlQuery.toString());

            // executa alteracao de status
            sqlQuery.executeUpdate();

        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

     }

     /**
     * Retorna um resultSet com o resultado do comando de sql da lista das funcoes
     * @return
     * @throws Exception
     */
    public ResultSet getListaCabecalho(Boolean pUsarFiltro) throws Exception {
        ResultSet sqlResult = null;
        String sqlCommand = new String();

        try {
            // retorna sqlresult sem filtro definido
            if (pUsarFiltro == false) {
                sqlResult = Conexao.getStatement().executeQuery(SQL_LISTA_CABECALHOS);
            }
            // retorna com filtro definido
            else {
                sqlCommand = SQL_LISTA_CABECALHOS_COM_FILTRO+(" and cab_data >= \'"+filtroDataInicial+"\'")+(" and cab_data <= \'"+filtroDataFinal+"\'")+(filtroCodigoChamado>0 ? " and cab_codigo = "+filtroCodigoChamado : "")+(filtroCodigoCliente>0 ? " and cab_cli_codigo = "+filtroCodigoCliente : "")+(filtroCodigocategoria>0 ? " and cab_cat_codigo = "+filtroCodigocategoria : "")+(filtroCriticidade>0 ? " and cab_criticidade = "+filtroCriticidade : "")+(filtroStatus>=0 ? " and cab_situacao = "+filtroStatus : "")+(filtroCodigoOperador>0 ? " and cab_codigo in (select det_cab_codigo from det_chamados where det_ope_codigo="+filtroCodigoOperador+") " : "")+(" ORDER BY cab_data");
                System.out.println("getListaCabecalho:ComFiltro: \n"+sqlCommand);
                sqlResult = Conexao.getStatement().executeQuery(sqlCommand);
            }

            return sqlResult;

        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * Salva uma instância de cabecalho de chamado no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pChamado
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public int salvar(ChamadoCab pChamadoCab) throws Exception {
        PreparedStatement sqlQuery = null;
        int resultado = 0;
        ResultSet sqlResult;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pChamadoCab.getCodigo() != 0) {
/**                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setString(1, pCategoria.getCat_descricao());
                sqlQuery.setInt(2, pCategoria.getCat_codigo());

                System.out.println("DAOCategoria.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
*/            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR_CABECALHO);

                sqlQuery.setInt(1, pChamadoCab.getCodCategoria());
                sqlQuery.setInt(2, pChamadoCab.getCodOperador());
                sqlQuery.setInt(3, pChamadoCab.getCodUsuario());
                sqlQuery.setInt(4, pChamadoCab.getIndiceCriticidade());
                sqlQuery.setInt(5, pChamadoCab.getIndiceSituacao());
                sqlQuery.setInt(6, pChamadoCab.getCodCliente());

                System.out.println("DAOChamadoCab.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            // executa inclusao
            sqlResult = Conexao.getStatement().executeQuery(sqlQuery.toString());
            
            // captura valor do cabecalho 
            if (sqlResult.next()){
                resultado = sqlResult.getInt("cab_codigo");
             }

        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

    public void clearFiltros() {
     filtroDataInicial = "01/01/2010";
     filtroDataFinal   = "01/01/2010";
     filtroCodigoCliente = -1;
     filtroCodigoChamado = -1;
     filtroCodigocategoria = -1;
     filtroCodigoOperador = -1;
     filtroCriticidade = -1;
     filtroStatus = -1;
    }

    public void setFiltroCodigoChamado(int filtroCodigoChamado) {
        this.filtroCodigoChamado = filtroCodigoChamado;
    }

    public void setFiltroCodigoCliente(int filtroCodigoCliente) {
        this.filtroCodigoCliente = filtroCodigoCliente;
    }

    public void setFiltroCodigoOperador(int filtroCodigoOperador) {
        this.filtroCodigoOperador = filtroCodigoOperador;
    }

    public void setFiltroCodigocategoria(int filtroCodigocategoria) {
        this.filtroCodigocategoria = filtroCodigocategoria;
    }

    public void setFiltroDataFinal(String filtroDataFinal) {
        this.filtroDataFinal = filtroDataFinal;
    }

    public void setFiltroDataInicial(String filtroDataInicial) {
        this.filtroDataInicial = filtroDataInicial;
    }

    public void setFiltroCriticidade(int filtroCriticidade) {
        this.filtroCriticidade = filtroCriticidade;
    }

    public void setFiltroStatus(int filtroStatus) {
        this.filtroStatus = filtroStatus;
    }


}
